#ifndef INICIALIZACAO_H
#define INICIALIZACAO_H

#include "classes.h"

#include <iostream>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <vector>
#include <fcntl.h>
#include <ctime>
#include <cstdlib>
#include <sys/ioctl.h>




#define VERMELHO "\033[40;31m"
#define VERDE    "\033[40;32m"
#define AMARELO  "\033[40;33m"
#define AZUL     "\033[40;34m"
#define ROXO     "\033[40;35m"
#define CIANO    "\033[40;36m"
#define BRANCO   "\033[40;37m"

#define AZULFUNDOVERDE "\033[42;34m"
#define AMARELOFUNDOVERDE "\033[42;35m"

#define VERMELHOFUNDO "\033[41m"
#define VERDEFUNDO "\033[42m"
#define MARROMFUNDO "\033[43m"
#define AZULFUNDO "\033[44m"
#define MAGENTAFUNDO "\033[45m"
#define CIANOFUNDO "\033[46m"
#define BRANCOFUNDO "\033[47m"

#define LIMPA "\033[;0m\033[40;37m" //limpa os efeitos


#define LIMITEMAXX    300
#define LIMITEMINX   -300
#define LIMITEMAXY    100
#define LIMITEMINY   -100

#define VELOCIDADEDOJOGO 1


enum objeto
{
    nErro   = -1,
    nNada   =  0,
    nVaca   =  1,
    nArvore =  2,
    nAldeao =  3,
    nTownCenter = 4,
    nBarraca = 5,
    nGuerreiro = 6
};




using namespace std;

int Meugetch();
int kbhit();
void gameover(int pontos);
void gotoXY(int x,int y);
void LimparTela();
void LimpaBuffer();
void escreveCutscene(string frase);

void desenho(int &TAMX, int &TAMY, int xDoJogador, int yDoJogador, int comida,int madeira,vector <ARVORE> arvores, vector<VACA> vacas, vector <CIDADAO> aldeoes, vector<LIMITE> limites, ONIBUS townCenter, MODOCONSTRUCAO modoConstrucao, vector <BARRACK> barracas, vector <GUERREIRO> guerreiro);
void logica(int &comida,int &madeira,vector <ARVORE> &arvores, vector<VACA> &vacas,vector <CIDADAO> &aldeoes, ONIBUS townCenter, vector <BARRACK> barracas, vector <GUERREIRO> guerreiro);
int verificaSeHaAlgumaCoisa (int xDesej, int yDesej, vector <VACA> vacas, vector <ARVORE> arvores, vector<CIDADAO> aldeoes, ONIBUS townCenter, vector <BARRACK> barracas, vector <GUERREIRO> guerreiro);
int criaObjeto (int x, int y, int queObjeto, vector<VACA> &vacas, vector<ARVORE> &arvores, vector<CIDADAO> &aldeoes, ONIBUS townCenter, vector <BARRACK> &barracas, vector <GUERREIRO> &guerreiro);
vector <XY> pathfind(int xComeco,int yComeco ,int &xDest, int &yDest, vector <VACA> vacas, vector <ARVORE> arvores, vector<CIDADAO> aldeoes, ONIBUS townCenter, vector <BARRACK> barracas, vector <GUERREIRO> guerreiro);
bool verificaSeHaAlgumaCoisaPath (int xDesej, int yDesej, vector <VACA> vacas, vector <ARVORE> arvores, vector<CIDADAO> aldeoes, vector<XY> listaAberta, vector <XY> listaFechada, ONIBUS townCenter, vector <BARRACK> barracas, vector <GUERREIRO> guerreiro);  ///Nescessario adicionar objetao NAO ESQUECER

void GeraArvore(vector <VACA> vacas, vector <ARVORE> &arvores, vector<CIDADAO> aldeoes, ONIBUS townCenter, vector <BARRACK> barracas, vector <GUERREIRO> guerreiro);
void GeraVacas(vector <VACA> &vacas, vector <ARVORE> arvores, vector<CIDADAO> aldeoes, ONIBUS townCenter, vector <BARRACK> barracas, vector <GUERREIRO> guerreiro);

int menorF(vector <XY> listaAberta);
int menorH(vector <XY> listaFechada);
int verificaQueArvore(int xDes, int yDes, vector <ARVORE> arvores);


int procuraArvoreMaisPerto(int xDes, int yDes, vector <ARVORE> arvores);
int procuraVacaMaisPerto(int xDes, int yDes, vector <VACA> vacas);
int geraID (int queObjeto);
int verificaQueVaca(int xDes, int yDes, vector <VACA> vacas);


int menu();
void instrucoes();



#endif // INICIALIZACAO_H_INCLUDED
